﻿using ExcellentProjectPlus.Dominio.Cuestionarios.Cuestionarios.Repositorios;
using ExcellentProjectPlus.Dominio.Cuestionarios.Opciones.Repositorios;
using ExcellentProjectPlus.Dominio.Cuestionarios.Preguntas.Repositorios;
using ExcellentProjectPlus.Dominio.Cuestionarios.Recursos.Repositorios;
using ExcellentProjectPlus.Dominio.Cuestionarios.Repositorios;
using ExcellentProjectPlus.Dominio.Cuestionarios.Repositorios.CuestionarioPreguntas;
using ExcellentProjectPlus.Infraestructura.Data.Cuestionarios.Modelo;
using ExcellentProjectPlus.Infraestructura.Data.Cuestionarios.Repositorios;
using ExcellentProjectPlus.Infraestructura.Transversales.Logging;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Validation;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ExcellentProjectPlus.Infraestructura.Data.Cuestionarios.UnidadDeTrabajo
{
    public class UnidadDeTrabajoCuestionarios
        : IUnidadDeTrabajoCuestionarios, IDisposable
    {
        DbContext context { get; set; }
        ITraceManager _traceManager;

        private RepositorioCuestionarios repositorioCuestionarios;
        private RepositorioOpciones repositorioOpciones;
        private RepositorioPreguntas repositorioPreguntas;
        private RepositorioRecursos repositorioRecursos;
        private RepositorioCuestionarioPreguntas repositorioCuestionarioPreguntas;

        #region Constructores
        public UnidadDeTrabajoCuestionarios(ITraceManager traceManager)
        {
            this._traceManager = traceManager;
            context = new CuestionariosContext();
        }
        #endregion

        public IRepositorioCuestionarios RepositorioCuestionarios
        {
            get
            {
                if (this.repositorioCuestionarios == null)
                {
                    this.repositorioCuestionarios = new RepositorioCuestionarios(context, _traceManager);
                }
                return repositorioCuestionarios;
            }
        }

        public IRepositorioOpciones RepositorioOpciones
        {
            get
            {
                if (this.repositorioOpciones == null)
                {
                    this.repositorioOpciones = new RepositorioOpciones(context, _traceManager);
                }
                return repositorioOpciones;
            }
        }

        public IRepositorioPreguntas RepositorioPreguntas
        {
            get
            {
                if (this.repositorioPreguntas == null)
                {
                    this.repositorioPreguntas = new RepositorioPreguntas(context, _traceManager);
                }
                return repositorioPreguntas;
            }
        }

        public IRepositorioRecursos RepositorioRecursos
        {
            get
            {
                if (this.repositorioRecursos == null)
                {
                    this.repositorioRecursos = new RepositorioRecursos(context, _traceManager);
                }
                return repositorioRecursos;
            }
        }
        public IRepositorioCuestionarioPreguntas RepositorioCuestionarioPreguntas
        {
            get
            {
                if (this.repositorioCuestionarioPreguntas == null)
                {
                    this.repositorioCuestionarioPreguntas = new RepositorioCuestionarioPreguntas(context, _traceManager);
                }
                return repositorioCuestionarioPreguntas;
            }
        }

        public void Confirmar()
        {
            try
            {
                context.SaveChanges();
            }
            catch (DbEntityValidationException validationException)
            {
                foreach (var exception in validationException.EntityValidationErrors)
                {
                    //exception.
                }
                throw;
            }
            catch (Exception ex)
            {
                throw;
            }
        }

        private bool disposed = false;
        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    context.Dispose();
                }
            }
            this.disposed = true;
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }



    }
}
